<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麥當苗兒 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace User\Model;
use Think\Model;
/**
 * 會員模型
 */
class UcenterMemberModel extends Model{
	/**
	 * 數據表前綴
	 * @var string
	 */
	protected $tablePrefix = UC_TABLE_PREFIX;

	/**
	 * 數據庫連接
	 * @var string
	 */
	protected $connection = UC_DB_DSN;

	/* 用戶模型自動驗證 */
	protected $_validate = array(
		/* 驗證用戶名 */
		array('username', '1,30', -1, self::EXISTS_VALIDATE, 'length'), //用戶名長度不合法
		array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), //用戶名禁止註冊
		array('username', '', -3, self::EXISTS_VALIDATE, 'unique'), //用戶名被占用

		/* 驗證密碼 */
		array('password', '6,30', -4, self::EXISTS_VALIDATE, 'length'), //密碼長度不合法

		/* 驗證郵箱 */
		array('email', 'email', -5, self::EXISTS_VALIDATE), //郵箱格式不正確
		array('email', '1,32', -6, self::EXISTS_VALIDATE, 'length'), //郵箱長度不合法
		array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), //郵箱禁止註冊
		array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), //郵箱被占用

		/* 驗證手機號碼 */
		array('mobile', '//', -9, self::EXISTS_VALIDATE), //手機格式不正確 TODO:
		array('mobile', 'checkDenyMobile', -10, self::EXISTS_VALIDATE, 'callback'), //手機禁止註冊
		array('mobile', '', -11, self::EXISTS_VALIDATE, 'unique'), //手機號被占用
	);

	/* 用戶模型自動完成 */
	protected $_auto = array(
		array('password', 'think_ucenter_md5', self::MODEL_BOTH, 'function', UC_AUTH_KEY),
		array('reg_time', NOW_TIME, self::MODEL_INSERT),
		array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
		array('update_time', NOW_TIME),
		//array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
	);

	/**
	 * 檢測用戶名是不是被禁止註冊
	 * @param  string $username 用戶名
	 * @return boolean          ture - 未禁用，false - 禁止註冊
	 */
	protected function checkDenyMember($username){
		return true; //TODO: 暫不限制，下壹個版本完善
	}

	/**
	 * 檢測郵箱是不是被禁止註冊
	 * @param  string $email 郵箱
	 * @return boolean       ture - 未禁用，false - 禁止註冊
	 */
	protected function checkDenyEmail($email){
		return true; //TODO: 暫不限制，下壹個版本完善
	}

	/**
	 * 檢測手機是不是被禁止註冊
	 * @param  string $mobile 手機
	 * @return boolean        ture - 未禁用，false - 禁止註冊
	 */
	protected function checkDenyMobile($mobile){
		return true; //TODO: 暫不限制，下壹個版本完善
	}

	/**
	 * 根據配置指定用戶狀態
	 * @return integer 用戶狀態
	 */
	protected function getStatus(){
		return true; //TODO: 暫不限制，下壹個版本完善
	}

	/**
	 * 註冊壹個新用戶
	 * @param  string $username 用戶名
	 * @param  string $password 用戶密碼
	 * @param  string $email    用戶郵箱
	 * @param  string $mobile   用戶手機號碼
	 * @return integer          註冊成功-用戶信息，註冊失敗-錯誤編號
	 */
	public function register($username,$account, $password, $email, $mobile,$address,$status){
		$data = array(
			'username' => $username,
                        'account'=>$account,
			'password' => $password,
			'email'    => $email,
			'mobile'   => $mobile,
                        'address'=>$address,
                        'status'=>$status,
		);
		//驗證手機
		if(empty($data['mobile'])) unset($data['mobile']);
                //會員卡號
		if(empty($data['account'])) unset($data['account']);
                //地址
		if(empty($data['address'])) unset($data['address']);
                //狀態
                if(empty($data['stutas'])) $data['status']=1;
                
		/* 添加用戶 */
		if($this->create($data)){
			$uid = $this->add();
			return $uid ? $uid : 0; //0-未知錯誤，大於0-註冊成功
		} else {
			return $this->getError(); //錯誤詳情見自動驗證註釋
		}
	}

	/**
	 * 用戶登錄認證
	 * @param  string  $username 用戶名
	 * @param  string  $password 用戶密碼
	 * @param  integer $type     用戶名類型 （1-用戶名，2-郵箱，3-手機，4-UID）
	 * @return integer           登錄成功-用戶ID，登錄失敗-錯誤編號
	 */
	public function login($username, $password, $type = 1){
		$map = array();
		switch ($type) {
			case 1:
				$map['username'] = $username;
				break;
			case 2:
				$map['email'] = $username;
				break;
			case 3:
				$map['mobile'] = $username;
				break;
			case 4:
				$map['id'] = $username;
				break;
			default:
				return 0; //參數錯誤
		}

		/* 獲取用戶數據 */
		$user = $this->where($map)->find();
		if(is_array($user) && $user['status']){
			/* 驗證用戶密碼 */
			if(think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']){
				$this->updateLogin($user['id']); //更新用戶登錄信息
				return $user['id']; //登錄成功，返回用戶ID
			} else {
				return -2; //密碼錯誤
			}
		} else {
			return -1; //用戶不存在或被禁用
		}
	}

	/**
	 * 獲取用戶信息
	 * @param  string  $uid         用戶ID或用戶名
	 * @param  boolean $is_username 是否使用用戶名查詢
	 * @return array                用戶信息
	 */
	public function info($uid, $is_username = false){
		$map = array();
		if($is_username){ //通過用戶名獲取
			$map['username'] = $uid;
		} else {
			$map['id'] = $uid;
		}

		$user = $this->where($map)->field('id,username,email,mobile,status')->find();
		if(is_array($user) && $user['status'] = 1){
			return array($user['id'], $user['username'], $user['email'], $user['mobile']);
		} else {
			return -1; //用戶不存在或被禁用
		}
	}

	/**
	 * 檢測用戶信息
	 * @param  string  $field  用戶名
	 * @param  integer $type   用戶名類型 1-用戶名，2-用戶郵箱，3-用戶電話
	 * @return integer         錯誤編號
	 */
	public function checkField($field, $type = 1){
		$data = array();
		switch ($type) {
			case 1:
				$data['username'] = $field;
				break;
			case 2:
				$data['email'] = $field;
				break;
			case 3:
				$data['mobile'] = $field;
				break;
			default:
				return 0; //參數錯誤
		}

		return $this->create($data) ? 1 : $this->getError();
	}

	/**
	 * 更新用戶登錄信息
	 * @param  integer $uid 用戶ID
	 */
	protected function updateLogin($uid){
		$data = array(
			'id'              => $uid,
			'last_login_time' => NOW_TIME,
			'last_login_ip'   => get_client_ip(1),
		);
		$this->save($data);
	}

	/**
	 * 更新用戶信息
	 * @param int $uid 用戶id
	 * @param string $password 密碼，用來驗證
	 * @param array $data 修改的字段數組
	 * @return true 修改成功，false 修改失敗
	 * @author huajie <banhuajie@163.com>
	 */
	public function updateUserFields($uid, $password, $data){
		if(empty($uid) || empty($password) || empty($data)){
			$this->error = '參數錯誤！';
			return false;
		}

		//更新前檢查用戶密碼
		if(!$this->verifyUser($uid, $password)){
			$this->error = '驗證出錯：密碼不正確！';
			return false;
		}

		//更新用戶信息
		$data = $this->create($data);
		if($data){
			return $this->where(array('id'=>$uid))->save($data);
		}
		return false;
	}

	/**
	 * 驗證用戶密碼
	 * @param int $uid 用戶id
	 * @param string $password_in 密碼
	 * @return true 驗證成功，false 驗證失敗
	 * @author huajie <banhuajie@163.com>
	 */
	protected function verifyUser($uid, $password_in){
		$password = $this->getFieldById($uid, 'password');
		if(think_ucenter_md5($password_in, UC_AUTH_KEY) === $password){
			return true;
		}
		return false;
	}

}